import axios from 'axios'

// 创建 uni-app 适配器
const uniAdapter = (config) => {
  return new Promise((resolve, reject) => {
    const { url, method, data, params, headers, baseURL, timeout } = config

    // 组合完整的url
    const fullUrl = baseURL + url

    console.log('发送请求前的完整配置:', {
      url: fullUrl,
      method,
      headers,
      data: method.toLowerCase() === 'get' ? params : data
    })

    uni.request({
      url: fullUrl,
      data: method.toLowerCase() === 'get' ? params : data,
      method: method.toUpperCase(),
      header: {  // uni-app 中使用 header 而不是 headers
        ...headers,
        'Authorization': uni.getStorageSync('token') || ''  // 直接在这里设置 token
      },
      timeout,
      success: (response) => {
        console.log('请求成功，响应数据:', response)
        resolve({
          data: response.data,
          status: response.statusCode,
          headers: response.header
        })
      },
      fail: (error) => {
        console.error('请求失败:', error)
        reject(error)
      }
    })
  })
}

// 创建 axios 实例
const service = axios.create({
  baseURL: process.env.NODE_ENV === 'development'
    ? 'http://127.0.0.1:5000/api'  // 开发环境
    : 'http://127.0.0.1:5000/api',  // 生产环境
  timeout: 5000,
  withCredentials: true, // 允许携带 cookie
  adapter: uniAdapter // 使用自定义的 uni-app 适配器
})

// 添加不需要token的白名单路径
const whiteList = [
  'auth/login',
  'auth/send-code'
]

// 请求拦截器
service.interceptors.request.use(
  config => {
    // 检查是否在白名单中
    const isWhiteList = whiteList.some(path => config.url.includes(path))

    // 如果不在白名单中，才检查token
    if (!isWhiteList) {
      const token = uni.getStorageSync('token')
      console.log('当前token:', token)

      if (token) {
        // 修改请求头格式为 Authorization: token
        config.headers = {
          ...config.headers,
          'Authorization': token
        }
        console.log('请求头:', config.headers)
      } else {
        console.log('未找到token')
        // 获取当前页面路径
        const pages = getCurrentPages()
        const currentPage = pages[pages.length - 1]
        const isLoginPage = currentPage?.route?.includes('login')

        // 如果不是登录页面且没有token，跳转到登录页
        if (!isLoginPage) {
          uni.navigateTo({
            url: '/pages/login2/login2'
          })
          return Promise.reject('请先登录')
        }
      }
    }

    return config
  },
  error => {
    console.error('请求错误：', error)
    return Promise.reject(error)
  }
)

// 响应拦截器
service.interceptors.response.use(
  response => {
    const res = response.data
    console.log('响应数据:', res)

    // 打印完整的响应信息，包括headers
    console.log('完整响应:', response)

    if (res.code === 401 || res.message === '缺少token') {
      console.log('token无效或缺失')
      // token 过期或无效
      uni.removeStorageSync('token')

      const pages = getCurrentPages()
      const currentPage = pages[pages.length - 1]
      const isLoginPage = currentPage?.route?.includes('login')

      if (!isLoginPage) {
        uni.navigateTo({
          url: '/pages/login2/login2'
        })
      }
      return Promise.reject(new Error(res.message || '请重新登录'))
    }

    return res
  },
  error => {
    console.error('响应错误:', error)
    console.error('响应配置:', error.config)
    console.error('响应头:', error.response?.headers)
    if (error.response?.status === 401) {
      // 清除 token
      uni.removeStorageSync('token')

      const pages = getCurrentPages()
      const currentPage = pages[pages.length - 1]
      const isLoginPage = currentPage?.route?.includes('login')

      if (!isLoginPage) {
        uni.navigateTo({
          url: '/pages/login2/login2'
        })
      }
    }
    return Promise.reject(error)
  }
)

// 封装 GET 请求
export function get(url, params) {
  return service({
    url,
    method: 'get',
    params
  })
}

// 封装 POST 请求
export function post(url, data) {
  return service({
    url,
    method: 'post',
    data
  })
}

// 封装 PUT 请求
export function put(url, data) {
  return service({
    url,
    method: 'put',
    data
  })
}

// 封装 DELETE 请求
export function del(url, params) {
  return service({
    url,
    method: 'delete',
    params
  })
}

export default service 